﻿#ifndef _COMMON_H_INCLUDE_
#define _COMMON_H_INCLUDE_

#include <QPoint>
#include <QRect>
#include <QString>

enum RoleType
{
    ROLETYPE_PLAYER = 0,      // 玩家
    ROLETYPE_ROBOT,           // 机器人
    ROLETYPE_MONSTER,         // 怪物
    ROLETYPE_NULL
};

enum RoleState
{
    ROLESTATE_WAITING = 0,       // 等待
    ROLESTATE_WALKING,           // 走动
    ROLESTATE_ATTACK,            // 攻击
    ROLESTATE_DEATH,             // 死亡
    ROLESTATE_GUARD,             // 警戒
    ROLESTATE_ESCAPE,            // 逃跑
    ROLESTATE_PURSURE,           // 追击
    ROLESTATE_NULL
};

enum AmmunitionType
{
    AMMUNITIONTYPE_ARMORPIERCING = 0,         // 破甲弹
    AMMUNITIONTYPE_WOMENSCATTERINGFLOWER,     // 天女散花弹
    AMMNUITIONTYPE_MULTIROUTE,                // 多路弹
    AMMNUITIONTYPE_STRAIGHTSNAKE,             // 一字长蛇弹
    AMMUUITIONTYPE_BLOOMING,                  // 开花弹
    AMMUNITIONTYPE_NULL
};

struct tagBulletInfo
{
    tagBulletInfo()
        : id(0),speed(0),distance(0),
          harm(0),
          type(AMMUNITIONTYPE_NULL),
          bulletsize(0),bulletlenght(0),
          anglestep(0),
          routecount(0) {}
    tagBulletInfo(int pid,AmmunitionType ptype,QString pname,
                  int pspeed,int pdistance,int pharm,
                  int pminsize,int pmaxsize,
                  int bs,int bl,
                  int as,
                  QString usb,int rc)
        : id(pid),type(ptype),name(pname),
          speed(pspeed),distance(pdistance),
          harm(pharm),
          minsize(pminsize),maxsize(pmaxsize),
          bulletsize(bs),bulletlenght(bl),
          anglestep(as),
          usbullet(usb),routecount(rc) {}

    int id;               // ID
    AmmunitionType type;  // 类型
    QString name;         // 名称
    int speed;            // 速度
    int distance;         // 距离
    int harm;             // 伤害
    int minsize;          // 初始大小
    int maxsize;          // 最大大小
    int bulletsize;       // 子弹大小
    int bulletlenght;     // 子弹长度(用于连续弹药)
    int anglestep;        // 角度步长(用于天女散花弹)
    QString usbullet;     // 所用子弹名称(用于多路弹)
    int routecount;       // 路数(用于多路弹)
};

struct tagDBUserData
{
    tagDBUserData()
        : id(0),type(0),curmap(0),blood(100),defense(0),
          experience(0),grade(0),
          currentusingbullet(0) {}
    tagDBUserData(int pid,int ptype,QString pun,QString pup,
                  QString ip,qint64 time,int cp,QPoint pos,
                  int b,int d,int e,int g,
                  QString shape,
                  QString bq,
                  int csb)
        : id(pid),username(pun),password(pup),curmappos(pos),
          type(ptype),lastip(ip),lasttime(time),curmap(cp),
          blood(b),defense(d),experience(e),grade(g),
          shapeinfo(shape),bulletquantity(bq),
          currentusingbullet(csb){}

    int id;
    int type;
    QString username;
    QString password;
    int curmap;
    QString lastip;
    QPoint curmappos;
    qint64 lasttime;
    int blood;
    int defense;
    int experience;
    int grade;
    QString shapeinfo;
    QString bulletquantity;
    int currentusingbullet;
};

struct tagGradeInfo
{
    tagGradeInfo()
        : id(0),experience(0) {}
    tagGradeInfo(int i,QString n,int e)
        : id(i),name(n),experience(e) {}

    int id;
    QString name;
    int experience;
};

struct tagMapEntrance
{
    tagMapEntrance()
        : targetmap(-1) {}
    tagMapEntrance(QRect r,int tm,QString rr)
        : rect(r),targetmap(tm),remark(rr) {}

    QRect rect;
    int targetmap;
    QString remark;
};

#define IDD_NETWORK_ADDROLE                 1000            // 添加角色
#define IDD_NETWORK_DELETEROLE              1001            // 删除角色
#define IDD_NETWORK_ROLEPOSITION            1002            // 角色位置信息
#define IDD_NETWORK_VIEWROLELIST            1003            // 角色可视的其它角色列表
#define IDD_NETWORK_PLAYERCHANGE            1004            // 玩家操作改变
#define IDD_NETWORK_ATTACK                  1005            // 攻击操作
#define IDD_NETWORK_ENTERMAP                1006            // 进入地图
#define IDD_NETWORK_LEAVEMAP                1007            // 离开地图
#define IDD_NETWORK_BULLETINFO              1008            // 弹药信息
#define IDD_NETWORK_PLAYERINFO              1009            // 得到玩家信息
#define IDD_NETWORK_ENTERSERVER             1011            // 玩家进入服务器
#define IDD_NETWORK_UPDATEROLEINFO          1012            // 更新角色信息
#define IDD_NETWORK_REINCARNATION           1013            // 角色重生
#define IDD_NETWORK_ATTACKED                1014            // 被攻击操作
#define IDD_NETWORK_NOTICE                  1015            // 公告

#define IDD_NETWORK_MSG_ERROR               5000            // 错误信息
#define IDD_NETWORK_MSG_LOGIN_FAIL          5001            // 用户登录失败
#define IDD_NETWORK_MSG_ENTERSERVER_FAIL    5002            // 用户进入服务器失败
#define IDD_NETWORK_ATTACK_FAIL             5003            // 攻击失败
#define IDD_NETWORK_REINCARNATION_FAIL      5004            // 重生失败
#define IDD_NETWORK_MSG_ENTERMAP_FAIL       5005            // 用户进入地图失败

QPoint calculateNewPoint(const QPoint &pointA, double length, double angleDegrees);
double calculateDistanceOptimized(const QPoint &point1,const QPoint &point2);

#endif // COMMON_H
